package cn.org.xwb.bookmall.model.utils;

import cn.org.xwb.bookmall.model.properties.MailProp;
import cn.org.xwb.bookmall.model.properties.ServerProp;
import cn.org.xwb.common.file.utils.FileUtil;
import cn.org.xwb.common.mail.dto.MailSendInfoDto;
import cn.org.xwb.common.mail.utils.MailUtil;
import cn.org.xwb.common.model.vo.RespResult;
import cn.org.xwb.common.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Objects;

/**
 * 和验证码相关的工具类
 */
@Component
public class BookCodeUtil {

    @Autowired
    private MailUtil mailUtil;

    @Autowired
    private MailProp mailProp;

    @Autowired
    private BookRedisUtil bookRedisUtil;

    @Autowired
    private ServerProp serverProp;

    /**
     * 判断验证码是否有效和正确
     *
     * @param code
     * @param code_cache
     * @return
     */
    public static RespResult<Object> judgeCode(String code, String code_cache) {
        if (Objects.isNull(code_cache)) return RespResult.fail("验证码已失效");
        if (!code_cache.equals(code)) return RespResult.fail("验证码错误");
        return null;
    }



    /**
     * 发送验证码
     *
     * @param to
     * @return
     */
    public Boolean sendCode(String to, String code) {
        try {
            // 获取邮件内容
            String content = "";
            if (serverProp.getEnv().equals("windows"))
                content = FileUtil.readFileContentByChar(FileUtil.getClassPathFileAbsolute(mailProp.getDefaultContentHtmlPathWindows()));
            else content = FileUtil.readFileContentByChar(mailProp.getDefaultContentHtmlPathLinux());
            // 替换邮件内容中的数据占位模板
            // 验证码
            content = content.replace(mailProp.getDefaultContentHtmlCodeTemplate(), code);
            // 验证码有效时间
            content = content.replace(mailProp.getDefaultContentHtmlExpireTemplate(), String.valueOf(mailProp.getCodeExpire() / 60));
            // 邮件发送信息
            MailSendInfoDto mailSendInfoDto = new MailSendInfoDto(
                    mailProp.getDefaultFrom(), to,
                    mailProp.getDefaultSubject(), content
            );
            // 发送邮件
            return mailUtil.sendHTMLMessage(mailSendInfoDto);
        } catch (IOException e) {
            return false;
        }
    }

    /**
     * 发送用户登录验证码
     *
     * @param to
     * @return true-成功；false-失败
     */
    public Boolean sendCodeLoginUser(String to) {
        // 生成 6 位随机数字验证码
        String code = RandomUtil.genRandNumStr(mailProp.getCodeLen());
        Boolean res = sendCode(to, code);
        // 失败
        if (!res) return false;
        // 缓存
        if (!bookRedisUtil.cacheLoginMailCodeAgainUser(to, code)) return false;
        if (!bookRedisUtil.cacheLoginMailCodeUser(to, code)) return false;
        return true;
    }

    /**
     * 发送管理员登录验证码
     *
     * @param to
     * @return true-成功；false-失败
     */
    public Boolean sendCodeLoginAdmin(String to) {
        // 生成 6 位随机数字验证码
        String code = RandomUtil.genRandNumStr(mailProp.getCodeLen());
        Boolean res = sendCode(to, code);
        // 失败
        if (!res) return false;
        // 缓存
        if (!bookRedisUtil.cacheLoginMailCodeAdmin(to, code)) return false;
        if (!bookRedisUtil.cacheLoginMailCodeAgainAdmin(to, code)) return false;
        return true;
    }

}
